package com.cs.beneficios.business.entity;

//import com.cs.beneficios.business.model.RepAtributoVO;
//import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import com.cs.beneficios.business.model.RepDetBeneficiarioVO;
import com.cs.beneficios.business.model.ReporteTotalBeneficiosOtorVO;
import com.cs.beneficios.common.ConnectionFactory;
//import java.util.LinkedList;
//import java.util.List;

public class ReporteTotalBeneficiariosDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public ReporteTotalBeneficiariosDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public Collection GetBeneficiarios(RepDetBeneficiarioVO criterea)
			throws SQLException {

		// parte adicional de la consulta (criterios de busqueda.)
		StringBuffer queryVars = new StringBuffer();
		StringBuffer sbQueryVars = new StringBuffer();

		if ((Object) criterea.getCodeSede() != null) {
			queryVars.append(" AND sede.CODIGO = " + criterea.getCodeSede());
			sbQueryVars.append(" AND sede_.CODIGO = " + criterea.getCodeSede());
		}
		if ((Object) criterea.getCodeSubprograma() != null) {
			queryVars.append(" AND subpro.CODIGO = "
					+ criterea.getCodeSubprograma());
			sbQueryVars.append(" AND subpro_.CODIGO = "
					+ criterea.getCodeSubprograma());
		}
		if ((Object) criterea.getCodePrograma() != null) {
			queryVars
					.append(" AND prog.CODIGO = " + criterea.getCodePrograma());
			sbQueryVars.append(" AND prog_.CODIGO = "
					+ criterea.getCodePrograma());
		}
		if ((Object) criterea.getCodeArea() != null) {
			queryVars.append(" AND area.CODIGO = " + criterea.getCodeArea());
			sbQueryVars.append(" AND area_.CODIGO = " + criterea.getCodeArea());
		}
		if ((Object) criterea.getDesde() != null
				&& (Object) criterea.getHasta() != null) {
			queryVars.append(" AND beneotor.FECHA_BENEFICIO BETWEEN TO_DATE('"
					+ criterea.getDesde() + "','dd/mm/rrrr') AND TO_DATE('"
					+ criterea.getHasta() + "','dd/mm/rrrr')");
			sbQueryVars
					.append(" AND beneotor_.FECHA_BENEFICIO BETWEEN TO_DATE('"
							+ criterea.getDesde()
							+ "','dd/mm/rrrr') AND TO_DATE('"
							+ criterea.getHasta() + "','dd/mm/rrrr')");
		}
		if ((Object) criterea.getDesde() != null
				&& (Object) criterea.getHasta() == null) {
			queryVars.append(" AND beneotor.FECHA_BENEFICIO >= TO_DATE('"
					+ criterea.getDesde() + "','dd/mm/rrrr')");
			sbQueryVars.append(" AND beneotor_.FECHA_BENEFICIO >= TO_DATE('"
					+ criterea.getDesde() + "','dd/mm/rrrr')");

		}
		if ((Object) criterea.getDesde() == null
				&& (Object) criterea.getHasta() != null) {
			queryVars.append(" AND beneotor.FECHA_BENEFICIO <= TO_DATE('"
					+ criterea.getHasta() + "','dd/mm/rrrr')");
			sbQueryVars.append(" AND beneotor_.FECHA_BENEFICIO <= TO_DATE('"
					+ criterea.getHasta() + "','dd/mm/rrrr')");

		}

		String query = "SELECT COUNT(DISTINCT beneotor.BEN_CODIGO) contador, "
				+ "sede.NOMBRE nomsede, prog.NOMBRE nompro, subpro.NOMBRE nomsubpro, area.NOMBRE secre "

				// subQuery
				+ ", (SELECT COUNT(DISTINCT beneficiario_.codigo) FROM TCS_BEN_PROGRAMA prog_, TCS_BEN_SUBPROGRAMA subpro_, TCS_BEN_BENEFICIO_OTORGADO beneotor_, TCS_BEN_SEDE sede_, TCS_BEN_BENEFICIARIO beneficiario_, TCS_BEN_AREA area_ WHERE beneotor_.SBPR_CODIGO =  subpro_.CODIGO AND area_.codigo = prog_.area_codigo AND beneotor_.SEDE_CODIGO = sede_.CODIGO AND subpro_.PRG_CODIGO = prog_.CODIGO AND beneficiario_.CODIGO = beneotor_.BEN_CODIGO AND prog_.vigencia='A' AND subpro_.vigencia='A'  "
				+ sbQueryVars.toString()
				+ " ) AS TOTAL_BENEFICIARIOS "

				+ "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, TCS_BEN_BENEFICIO_OTORGADO beneotor, "
				+ "TCS_BEN_SEDE sede, TCS_BEN_BENEFICIARIO beneficiario, TCS_BEN_AREA area "
				+ "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "
				+ "AND area.codigo = prog.area_codigo "
				+ "AND beneotor.SEDE_CODIGO = sede.CODIGO "
				+ "AND subpro.PRG_CODIGO = prog.CODIGO "
				+ "AND beneficiario.CODIGO = beneotor.BEN_CODIGO and prog.vigencia='A' AND subpro.vigencia='A'  ";

		query += queryVars.toString();
		query += " GROUP BY area.NOMBRE, prog.NOMBRE, subpro.NOMBRE, sede.NOMBRE ";
		query += " ORDER BY area.NOMBRE, prog.NOMBRE, subpro.NOMBRE, sede.NOMBRE ";

		System.out.println("query_totalBeneficiarios: " + query);

		ResultSet rst = null;
		ArrayList lbeneotor = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		ReporteTotalBeneficiosOtorVO objbeneficios = null;
		long totalBeneficiarios = 0;
		int firstRow = 0;

		while (rst.next()) {
			objbeneficios = new ReporteTotalBeneficiosOtorVO();
			objbeneficios.setNombrePrograma(rst.getString("nompro"));
			objbeneficios.setNombreSubprograma(rst.getString("nomsubpro"));
			objbeneficios.setNombreSede(rst.getString("nomsede"));
			objbeneficios.setContador(rst.getLong("contador"));
			objbeneficios.setNombreArea(rst.getString("secre"));
			
			//total += rst.getLong("contador");
			if (firstRow == 0) {
				totalBeneficiarios = rst.getLong("TOTAL_BENEFICIARIOS");
				firstRow++;
			}

			lbeneotor.add(objbeneficios);
			objbeneficios = null;
		}

		if (lbeneotor.size() > 0) {
			objbeneficios = new ReporteTotalBeneficiosOtorVO();
			objbeneficios.setNombrePrograma("VALOR TOTAL");
			// String valortotal = String.valueOf(total);
			//objbeneficios.setContador(total);
			objbeneficios.setContador(totalBeneficiarios);

			lbeneotor.add(objbeneficios);
			objbeneficios = null;
		}

		rst.close();
		return lbeneotor;
	}

	/************************************************
	 * Metodo para provisional para recuprar los filtros utilizados en el
	 * reporte
	 * *********************************************/
	public RepDetBeneficiarioVO getFilters(RepDetBeneficiarioVO objRtbVO)
			throws SQLException {
		String strQuery = null;
		ResultSet rst = null;

		if (objRtbVO.getCodeSede() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_SEDE"
					+ " WHERE CODIGO = " + objRtbVO.getCodeSede();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtbVO.setNombreSede(rst.getString("NOMBRE"));
		}
		if (objRtbVO.getCodePrograma() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_PROGRAMA"
					+ " WHERE CODIGO = " + objRtbVO.getCodePrograma();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtbVO.setNombrePrograma(rst.getString("NOMBRE"));
		}
		if (objRtbVO.getCodeSubprograma() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_SUBPROGRAMA"
					+ " WHERE CODIGO = " + objRtbVO.getCodeSubprograma();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtbVO.setNombreSubprograma(rst.getString("NOMBRE"));
		}
		if (objRtbVO.getCodeArea() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_AREA"
					+ " WHERE CODIGO = " + objRtbVO.getCodeArea();
			rst = cf.getRecordsRset(strQuery, null, conn);

			rst.next();
			objRtbVO.setNombreArea(rst.getString("NOMBRE"));
		}

		if (rst != null)
			rst.close();

		return objRtbVO;
	}

	public Connection getConn() {
		return conn;
	}
}